;功能：以十六进制的形式在屏幕中间显示字节型数据（292页）
;方法：
;   数据段使用数据标号	将数据标号作为数据定义
;   cmp、je、ja实现多重条件判断		jmp跳转指令
;   call、ret指令实现子程序调用
assume cs:code

data segment
	a db 'a!b@c#%',0
	b dw a
data ends

code segment
start:
	mov ax,data
	mov ds,ax
	mov si,b
	mov ax,0b800h
	mov es,ax
	mov di,160*12+2*40

	call two_hex_show

	mov ax,4c00h
	int 21h

two_hex_show:
	push ax
	push cx
	push ds
	push si
	push es
	push di
s:
	mov al,[si]
	cmp al,0
	je two_hex_show_ret
	mov ah,al
	mov cl,4
	shr ah,cl
	and al,00001111b

	cmp ah,9
	;大于9，跳转
	ja above_nine_h
	add ah,30h
	jmp short nexth
above_nine_h:
	;大于9
	add ah,37h

nexth:
	cmp al,9
	ja above_nine_l
	add al,30h
	jmp short nextl
above_nine_l:
	;大于9
	add al,37h
	
nextl:
	mov es:[di],ah
	mov byte ptr es:[di+1],24h
	mov es:[di+2],al
	mov byte ptr es:[di+3],24h
	mov byte ptr es:[di+4],' '
	inc si
	add di,6
	jmp short s

two_hex_show_ret:
	pop di
	pop es
	pop si
	pop ds
	pop cx
	pop ax
	ret
code ends
end start